﻿/* UTF-8 */

/*
 * glyph.h: 生成字符图形
 * Copyright 2016 tianxianglong. All rights reserved.
 */

 /*
  * Permission is hereby granted, free of charge, to any person obtaining a copy of
  * this software and associated documentation files (the "Software"), to deal in
  * the Software without restriction, including without limitation the rights to
  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  * the Software, and to permit persons to whom the Software is furnished to do so,
  * subject to the following conditions:

  * The above copyright notice and this permission notice shall be included in all
  * copies or substantial portions of the Software.

  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */

#pragma once

#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <Windows.h>

#ifdef FT2_IMPL
#include <ft2build.h>
#include FT_FREETYPE_H
#endif

struct GLYPHBITMAP
{
	GLYPHMETRICS gm;
	BYTE *bits;
};

typedef struct GLYPHBITMAP GLYPHBITMAP;

struct GLYPHCOORD
{
	/* top-left corner */
	float u;
	float v;

	USHORT x;
	USHORT y;


	/* right-bottom corner */

	float u2;
	float v2;

	USHORT x2;
	USHORT y2;

	/* advance */
	SHORT ax;
	SHORT ay;

	/* baseline */
	SHORT ox;
	SHORT oy;
};

typedef struct GLYPHCOORD GLYPHCOORD;

#define REMIN(b) ((0xff & (BYTE)b) & 0x07)
#define UNPACK_PIXEL_MSB(by, idx) (((by) >> (7 - REMIN(idx))) & 0x01)
#define PACK_PIXEL_MSB(by, idx, val) ((by) | (((val) & 0x01) << (7 - REMIN(idx))))

#define UNPACK_PIXEL(by, idx) UNPACK_PIXEL_MSB(by, idx)
#define PACK_PIXEL(by, idx, val) PACK_PIXEL_MSB(by, idx, val)


struct FONTOBJECT
{
	UINT FontSize;
	UINT Format;

	GLYPHSET *glyphset;
	UINT Count;
	WCHAR codepoints[65536];
	USHORT indices[65536];
	GLYPHMETRICS *metrics;
	DWORD *cbbitmaps;
	LPBYTE *bitmaps;

	DWORD kern_count;
	LPKERNINGPAIR kerning;
};

typedef struct FONTOBJECT FONTOBJECT;
typedef FONTOBJECT * FONTOBJECTPTR;

FONTOBJECTPTR MakeGdiFont(LPCWSTR FontName, UINT FontSize, UINT Format);

DWORD CalcFontMemSize(FONTOBJECTPTR Font);
